package com.nuc.kl.module.usermanager.service.impl;

import java.util.Collection;
import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.nuc.kl.base.DaoSupportImpl;
import com.nuc.kl.module.usermanager.dao.UserDao;
import com.nuc.kl.module.usermanager.entity.Privilege;
import com.nuc.kl.module.usermanager.entity.Role;
import com.nuc.kl.module.usermanager.entity.User;
import com.nuc.kl.module.usermanager.service.UserService;
import com.opensymphony.xwork2.ActionContext;

@Service
@Transactional
public class UserServiceImpl extends DaoSupportImpl<User> implements UserService{
	
	@Resource
	private UserDao userDao;
	
	public Long countUser(){
		return userDao.countUser();
		
	}
	
	
	/**
	 * 判断本用户是否有指定名称的权限
	 * 
	 * @param name
	 * @return
	 */
	public boolean hasPrivilegeByName(String name,User user) {
		// 超级管理有所有的权限
		if (isAdmin(user.getLoginName())) {
			return true;
		}

		// 普通用户要判断是否含有这个权限
		for (Role role : user.getRoles()) {
			for (Privilege priv : role.getPrivileges()) {
				if (priv.getName().equals(name)) {
					return true;
				}
			}
		}
		return false;
	}

	/**
	 * 判断本用户是否有指定URL的权限
	 * 
	 * @param privUrl
	 * @return
	 */
	public boolean hasPrivilegeByUrl(String privUrl,User user) {
		// 超级管理有所有的权限
		if (isAdmin(user.getLoginName())) {
			return true;
		}

		// >> 去掉后面的参数
		int pos = privUrl.indexOf("?");
		if (pos > -1) {
			privUrl = privUrl.substring(0, pos);
		}
		// >> 去掉UI后缀
		if (privUrl.endsWith("UI")) {
			privUrl = privUrl.substring(0, privUrl.length() - 2);
		}

		// 如果本URL不需要控制，则登录用户就可以使用
		Collection<String> allPrivilegeUrls = (Collection<String>) ActionContext.getContext().getApplication().get("allPrivilegeUrls");
		if (!allPrivilegeUrls.contains(privUrl)) {
			return true;
		} else {
			// 普通用户要判断是否含有这个权限
			for (Role role : user.getRoles()) {
				for (Privilege priv : role.getPrivileges()) {
					if (privUrl.equals(priv.getUrl())) {
						return true;
					}
				}
			}
			return false;
		}
	}

	/**
	 * 判断本用户是否是超级管理员
	 * 
	 * @return
	 */
	public boolean isAdmin(String loginName) {
		return "admin".equals(loginName);
	}

}
